package cn.tedu.fresheveryday.service.impl;

import cn.tedu.fresheveryday.mapper.ProductMapper;
import cn.tedu.fresheveryday.pojo.dto.ProductPagerDTO;
import cn.tedu.fresheveryday.pojo.entity.Product;
import cn.tedu.fresheveryday.pojo.vo.ProductDetailVO;
import cn.tedu.fresheveryday.pojo.vo.ProductSimpleVO;
import cn.tedu.fresheveryday.service.IProductService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Slf4j
@Service
public class ProductServiceImpl implements IProductService {
    @Autowired
    private ProductMapper mapper;

    @Override
    public ProductDetailVO selectById(int id) {
        log.debug("根据id（{}）获取商品详情……", id);

        // 商品浏览量+1
        mapper.increaseViewCount(id);

        // 从repository中调用方法，根据id获取缓存的数据
        // 判断缓存中是否存在与此id对应的key
        /*boolean exists = redisRepository.exists(id);

        if (exists) {
            Product cacheResult = redisRepository.getDetailsById(id);

            if (cacheResult != null) {
                ProductDetailVO productDetailVO = new ProductDetailVO();
                BeanUtils.copyProperties(cacheResult, productDetailVO);

                return productDetailVO;
            } else {
                throw new ServiceException(ResponseCode.BAD_REQUEST, "获取商品详情失败，尝试访问的数据不存在！");
            }
        }*/

        // 缓存中没有此id匹配的数据
        // 从mapper中调用方法，根据id获取数据库的数据
        //log.debug("没有命中缓存，则从数据库查询数据……");
        Product dbResult = mapper.selectById(id);

        // 判断从数据库中获取的结果是否为null
        /*if (dbResult == null) {
            // 是：数据库也没有此数据，先向缓存中写入错误数据，再抛出异常
            log.warn("数据库中也无此数据（id={}），先向缓存中写入错误数据", id);
            redisRepository.saveEmptyValue(id);
            log.warn("抛出异常");
            throw new ServiceException(ResponseCode.BAD_REQUEST, "获取商品详情失败，尝试访问的数据不存在！");
        }*/

        // 将从数据库中查询到的结果存入到缓存中
        /*log.debug("已经从数据库查询到匹配的数据，将数据存入缓存……");
        redisRepository.save(dbResult);*/
        // 返回查询结果
        log.debug("返回查询到数据：{}", dbResult);

        ProductDetailVO productDetailVO = new ProductDetailVO();
        BeanUtils.copyProperties(dbResult, productDetailVO);

        return productDetailVO;
    }

    @Override
    public List<ProductSimpleVO> selectNew() {
        return mapper.selectNew();
    }

    @Override
    public List<Product> selectByPage(ProductPagerDTO productPagerDTO) {
        // 获取页数和每页的记录数
        Integer page = productPagerDTO.getPage();
        Integer size = productPagerDTO.getSize();

        // 通过页数和记录数计算偏移量
        productPagerDTO.setOffset((page - 1) * size);

        return mapper.selectByPage(productPagerDTO);
    }

    @Override
    public int selectCountByPage(ProductPagerDTO productPagerDTO) {
        return mapper.selectCountByPage(productPagerDTO);
    }

    @Override
    public void preloadCache() {
        /*log.debug("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
        log.debug("删除缓存中各独立的商品数据……");
        redisRepository.deleteAllItem();
        log.debug("删除缓存缓存预热完成。");

        log.debug("从数据库查询商品列表……");
        List<Product> list = mapper.selectAll();

        for (Product product : list) {
            log.debug("查询结果：{}", product);
            log.debug("将当前商品存入到Redis：{}", product);

            redisRepository.save(product);
        }

        log.debug("将商品列表写入到Redis完成！");
        log.debug("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");*/
    }

}
